# Структурный шаблон проектирования ("Декоратор")
# Позволяет добавлять объекту поведение

import abc


class Iprocessor(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def process(self):
        pass


class Transmitter(Iprocessor):
    def __init__(self, data: str):
        self.__data = data

    def process(self):
        print(f"Данные {self.__data} переданы по каналу связи")


class Shell(Iprocessor):
    def __init__(self, pr: Iprocessor):
        self._processor = pr

    @abc.abstractmethod
    def process(self):
        self._processor.process()


class HammingCoder(Shell):
    def __init__(self, pr: Iprocessor):
        super().__init__(pr)

    def process(self):
        print("Наложен помехоустойчивый код Хэмминга->", end='')
        self._processor.process()


class Encryptor(Shell):
    def __init__(self, pr: Iprocessor):
        super().__init__(pr)

    def process(self):
        print("Шифрование данных->", end='')
        self._processor.process()


if __name__ == "__main__":
    transmitter: Iprocessor = Transmitter('12345')
    transmitter.process()
    print()

    hamming_code: Shell = HammingCoder(transmitter)
    hamming_code.process()
    print()

    encryptor: Shell = Encryptor(hamming_code)
    encryptor.process()

# Данные 12345 переданы по каналу связи

# Наложен помехоустойчивый код Хэмминга->Данные 12345 переданы по каналу связи

# Шифрование данных->Наложен помехоустойчивый код Хэмминга->Данные 12345 переданы по каналу связи
